package com.software.car.api;

import com.software.car.common.utils.CommonPage;
import com.software.car.entity.dto.request.UserInsertRequest;
import com.software.car.entity.dto.request.WeChatLoginRequest;
import com.software.car.entity.dto.response.UserResponse;
import com.software.car.entity.dto.request.WebLoginRequest;
import com.software.car.entity.po.UserPo;

import java.util.List;

/**
 *
 * 用户管理Service
 *
 * @Author 魔法はまだ解けない
 * @Date 2021/1/23
 */
public interface UserService {

    /**
     * 获取所有用户信息
     * @param state 状态，null即获取所有
     * @return
     */
     List<UserResponse> getAllUserResponse(int state);

    /**
     * 管理员调用
     * 获取分页后的用户列表
     * @param page  页号
     * @param pageSize  页大小
     * @return
     */
    CommonPage getUsersByPage(Integer page, Integer pageSize,Integer state);

    /**
     * 通过用户id获取用户
     * @param id
     * @return
     */
    UserResponse getUser(String id);

    /**
     * 通过用户id获取用户详细信息
     * @param id
     * @return
     */
    UserPo getUserPo(String id);

    /**
     * 登陆调用
     * 通过账号密码获取用户信息
     * @param webLoginRequest
     * @return
     */
    UserResponse getUser(WebLoginRequest webLoginRequest);

    /**
     * 登陆调用
     * 微信登陆信息获取用户
     * @param weChatLoginRequest
     * @return
     */
    UserResponse getUser(WeChatLoginRequest weChatLoginRequest);

    /**
     * 插入新用户
     * @param userPo
     * @return
     */
    int insertUser(UserPo userPo);

    /**
     * 针对管理员添加用户接口
     * 用户数据体构建用户数据
     * @param userInsertRequest
     * @return
     */
    int insertUser(UserInsertRequest userInsertRequest);

    /**
     * 通过account获取用户
     * @param account
     * @return
     */
    UserResponse getUserByAccount(String account);

    /**
     * 将非空的信息，从 参数1 覆盖到 参数2
     * 并执行修改操作
     * @param updateUser 要修改的数据体
     * @param baseUser 原本用户数据
     * @return 返回一个基本用户信息
     */
    UserResponse updateUser(UserPo updateUser,UserPo baseUser);

    /**
     * 用户修改个人信息
     * 构造符合用户能修改的参数
     * @param updateUser 要修改的个人信息模板
     * @param baseUser 个人信息，修改会依据此id
     * @return
     */
    UserResponse userUpdateUser(UserPo updateUser, UserPo baseUser);

    /**
     * 管理员修改用户信息
     * 将数据进行体构造
     * @param updateUser 要修改的用户信息模板
     * @return
     */
    UserResponse administerUpdateUser(UserPo updateUser);


}
